package com.zapi.ai.service;

import com.zapi.ai.config.QwenConfig;
import com.zapi.ai.model.ChatMessage;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 阿里云通义千问服务
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class QwenService {
    
    private final QwenConfig qwenConfig;
    
    /**
     * 调用通义千问生成回复
     *
     * @param userMessage 用户消息
     * @param history 历史消息
     * @return AI回复
     */
    public String chat(String userMessage, List<ChatMessage> history) {
        try {
            log.info("调用通义千问API: model={}, message={}", qwenConfig.getModel(), userMessage);
            
            // 构建消息列表
            List<Message> messages = buildMessages(userMessage, history);
            
            // 构建请求参数（暂不设置temperature和topP，使用SDK默认值）
            GenerationParam param = GenerationParam.builder()
                    .apiKey(qwenConfig.getApiKey())
                    .model(qwenConfig.getModel())
                    .messages(messages)
                    .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                    .maxTokens(qwenConfig.getMaxTokens())
                    .build();
            
            // 调用API
            Generation gen = new Generation();
            GenerationResult result = gen.call(param);
            
            // 提取回复内容
            String response = result.getOutput().getChoices().get(0).getMessage().getContent();
            log.info("通义千问回复成功，token使用: {}", result.getUsage().getTotalTokens());
            
            return response;
            
        } catch (NoApiKeyException e) {
            log.error("通义千问API Key未配置", e);
            throw new RuntimeException("AI服务配置错误：API Key未设置。请在环境变量中设置DASHSCOPE_API_KEY或在配置文件中设置ai.qwen.api-key");
        } catch (ApiException | InputRequiredException e) {
            log.error("通义千问API调用失败", e);
            throw new RuntimeException("AI服务调用失败：" + e.getMessage());
        } catch (Exception e) {
            log.error("通义千问服务异常", e);
            throw new RuntimeException("AI服务异常，请稍后重试");
        }
    }
    
    /**
     * 构建消息列表
     */
    private List<Message> buildMessages(String userMessage, List<ChatMessage> history) {
        List<Message> messages = new ArrayList<>();
        
        // 添加系统提示词
        Message systemMessage = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content("你是一个后台管理系统的AI助手。你的职责是帮助用户操作系统、查询数据、执行任务。" +
                        "你需要：\n" +
                        "1. 用简洁、专业的语言回答问题\n" +
                        "2. 提供具体可操作的建议\n" +
                        "3. 识别用户意图并给出相应功能指引\n" +
                        "4. 当不确定时，引导用户提供更多信息\n" +
                        "5. 使用友好、礼貌的语气交流")
                .build();
        messages.add(systemMessage);
        
        // 添加历史消息（最近10条）
        if (history != null && !history.isEmpty()) {
            List<Message> historyMessages = history.stream()
                    .limit(10)
                    .map(msg -> Message.builder()
                            .role(msg.getRole().equals("user") ? Role.USER.getValue() : Role.ASSISTANT.getValue())
                            .content(msg.getContent())
                            .build())
                    .collect(Collectors.toList());
            messages.addAll(historyMessages);
        }
        
        // 添加当前用户消息
        Message currentMessage = Message.builder()
                .role(Role.USER.getValue())
                .content(userMessage)
                .build();
        messages.add(currentMessage);
        
        return messages;
    }
}

